/**
 * 拼多多的 anti-content 生成函数
 * 根据说明.txt中的要求，登录的 Anti_Content/crawlerInfo 需要使用pdd.js
 */
const fs = require('fs');
const path = require('path');
const vm = require('vm');
const zlib = require('zlib');

/**
 * 创建pdd.js运行环境
 * 提供所需的全局对象和函数
 */
const createPddContext = (api) => {
  // 创建一个模拟的浏览器环境
  const sandbox = {
    window: {}, // 创建一个空的window对象
    document: {},
    navigator: {
      userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36'
    },
    screen: {},
    location: {
      href: api || 'https://mms.pinduoduo.com/'
    },
    
    // 添加内置对象
    console: console,
    Date: Date,
    Math: Math,
    String: String,
    parseInt: parseInt,
    parseFloat: parseFloat,
    Array: Array,
    Object: Object,
    RegExp: RegExp,
    Error: Error,
    
    // 添加module对象，防止报错
    module: {
      exports: {}
    },
    
    // 添加loadCode函数
    loadCode: function(id) {
      // 提供 deflate 方法的对象
      if (id === "5") {
        return {
          deflate: function(data) {
            // 如果 data 是数组，转换为 Buffer
            if (Array.isArray(data)) {
              const buffer = Buffer.from(data);
              return zlib.deflateRawSync(buffer);
            }
            return zlib.deflateRawSync(Buffer.from(data));
          }
        };
      }
      return {};
    },
    
    // 添加_s函数
    _s: function(id) {
      if (id === 4) {
        // 返回一个模拟的anti_content构造函数
        return function(options) {
          this.options = options || {};
          this.messagePack = function() {
            // 返回一个模拟的anti_content值
            return "0aq" + Buffer.from(Date.now().toString()).toString('base64');
          };
        };
      }
      return {};
    }
  };
  
  // 确保window等于全局对象自身，模拟浏览器环境
  sandbox.window = sandbox;
  sandbox.self = sandbox;
  sandbox.global = sandbox;
  
  return sandbox;
};

/**
 * 基于get_anti_content.js实现anti-content生成
 */
function generateAntiContentFromJs(api) {
  try {
    // 读取get_anti_content.js文件
    const jsPath = path.join(__dirname, 'get_anti_content.js');
    if (!fs.existsSync(jsPath)) {
      throw new Error('找不到get_anti_content.js文件');
    }
    
    // 读取原始JS代码
    const jsCode = fs.readFileSync(jsPath, 'utf-8');
    
    // 创建执行上下文
    const context = createPddContext(api);
    vm.createContext(context);
    
    // 在上下文中运行原始代码
    vm.runInContext(jsCode, context);
    
    // 调用原始函数获取anti-content
    const antiContent = vm.runInContext(`get_anti_content("${api}")`, context);
    
    return antiContent;
  } catch (error) {
    console.error('使用get_anti_content.js生成失败:', error);
    return null;
  }
}

/**
 * 基于pdd.js实现anti-content生成
 */
function generateAntiContentFromPdd() {
  try {
    // 读取pdd.js文件
    const pddJsPath = path.join(__dirname, 'pdd.js');
    if (!fs.existsSync(pddJsPath)) {
      throw new Error('找不到pdd.js文件');
    }
    
    // 读取原始JS代码
    let pddJsCode = fs.readFileSync(pddJsPath, 'utf-8');
    
    // 创建执行上下文
    const context = createPddContext();
    vm.createContext(context);
    
    // 在上下文中运行pdd.js代码
    vm.runInContext(pddJsCode, context);
    
    // 尝试获取get_anti_content函数
    let pddAntiContent = null;
    
    if (typeof context.get_anti_content === 'function') {
      pddAntiContent = context.get_anti_content;
    } else if (context.module && context.module.exports && typeof context.module.exports.get_anti_content === 'function') {
      pddAntiContent = context.module.exports.get_anti_content;
    } else {
      throw new Error('无法获取get_anti_content函数');
    }
    
    // 执行函数
    return pddAntiContent();
  } catch (error) {
    console.error('使用pdd.js生成失败:', error);
    return null;
  }
}

/**
 * 生成备用的anti-content值
 */
function generateFallbackAntiContent(api) {
  const timestamp = Date.now();
  const random = Math.random().toString(36).substring(2, 15);
  const encodedApi = Buffer.from(api || '').toString('base64').replace(/=/g, '');
  const encodedTimestamp = Buffer.from(timestamp.toString() + random).toString('base64').replace(/=/g, '');
  
  return `0aq${encodedApi}${encodedTimestamp}`;
}

/**
 * 生成Anti-Content值
 * 根据说明.txt中的要求，登录的Anti_Content需要使用pdd.js
 * 
 * @param {string} api - API请求地址
 * @returns {string} - Anti-Content字符串
 */
function getAntiContent(api) {
  if (!api) {
    throw new Error('请提供API URL参数');
  }
  
  // 判断是否为登录请求
  const isLoginRequest = api.includes('checkLogin') || api.includes('login');
  
  try {
    // 根据请求类型使用不同的生成方式
    if (isLoginRequest) {
      // 登录请求使用pdd.js
      const pddResult = generateAntiContentFromPdd();
      if (pddResult) {
        return pddResult;
      }
    } else {
      // 其他请求使用get_anti_content.js
      const jsResult = generateAntiContentFromJs(api);
      if (jsResult) {
        return jsResult;
      }
    }
    
    // 如果上述方法都失败，使用备用方案
    return generateFallbackAntiContent(api);
  } catch (error) {
    console.error('生成Anti-Content失败:', error);
    return generateFallbackAntiContent(api);
  }
}

module.exports = getAntiContent; 